Error Handlingの実装
コンパイル時に実行できる箇所と、実行時にしか実行できない箇所をちゃんと区別しないとごっちゃになりそう
例外処理の手順
例外がthrowされたら、そのスコープがtryの中かどうかを確認する
tryの中でなかったら、今いるmethodの呼び出し元へ戻る
という作業を繰り返して、もっとも近いスコープにあるtry節を見つけ、そのままcatch節へジャンプする
この時に排他制御の処理をするメソッドを抜ける必要がある場合は、排他ロックの解除も同時にしないといけない フェーズ
コンパイル時に実行できる箇所
throwがtryブロックの中にあるかどうかのチェック
もしtryの中ならcatchへジャンプ
そうじゃないなら呼び出し元へ戻る
実行時に実行できる箇所
thorwされたmethodを抜けて呼び出し元へ戻る
実現方法
『コンパイラとバーチャルマシン』.icon p.123も参考
例外の発生を検出して投げる方法
投げた例外をハンドラまで送り届けるもの(try..catch)
『コンパイラとバーチャルマシン』.iconにかかれているのはtry..catchのようなよくある手続き的な例外機構の話だが、 やっぱりモダンな後者のほうが楽なんだろうか
参考